package org.example.seven;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import org.example.utils.RabbitMqUtil;

import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.TimeoutException;

/**
 * topic: 发送到类型是topic交换机的消息的routing_key不能随意写,不许满足一定的要求,它必须是一个单词列表,以点号分隔开.
 * 这些单词可以使任意单词,比如说:"stock.usd.nyse",这种类型的.当然这个单词列表最多不超过255个字节
 * 在这个规则列表中,其中有两个替换符是需要注意的 *(星号)可以代替一个单词 #(井号)可以替代零个或多个单词
 *
 * Q1: *.orange.*
 * Q2: *.*.rabbit  ,  lazy.#
 * quick.orange.rabbit   被队列Q1Q2接收到
 * lazy.orange.elephant     被队列Q1Q2接收到
 * quick.orange.fox     被队列Q1接收到
 * lazy.brown.fox       被队列Q2接收到
 * lazy.pink.rabbit     虽然满足两个绑定但只被Q2接收一次
 * quick.brown.fox      不匹配任何绑定不会被任何队列接收到会被丢弃
 * quick.orange.male.rabbit     是四个单词不匹配任何绑定会被丢弃
 *
 * 当一个队列绑定键是#,那么这个队列将接收所有数据,就有点像fanout了
 * 如果队列中绑定键当中没有#和*出现,那么改队列绑定类型就是direct了
 */
public class EmitLogTopic {
    public static final String EXCHANGE_NAME = "topic";

    public static void main(String[] args) throws IOException, TimeoutException {
        String routingKey = "quick.brown.fox";
        Channel channel = RabbitMqUtil.getChannel();
        //声明交换机
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.TOPIC);
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            String message = scanner.next();
            //发送消息
            channel.basicPublish(EXCHANGE_NAME,routingKey,null,message.getBytes());
            System.out.println("消息发送成功: "+message);
        }
    }
}
